package com.hyt.it.ogt.kq.service.gov.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.common.config.exception.KqException;
import com.hyt.it.ogt.kq.service.gov.model.TaskSubjectImportDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.ExamSubjectDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.TaskTimeSubjectArrangeDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.TimeSubjectBindingDTO;
import com.hyt.it.ogt.kq.service.gov.model.entity.TaskArea;
import com.hyt.it.ogt.kq.service.gov.model.excel.OfficeAreaSheet;
import com.hyt.it.ogt.kq.service.gov.model.param.ExamSubjectParam;
import com.hyt.it.ogt.kq.service.gov.model.param.SubjectParam;
import com.hyt.it.ogt.kq.service.gov.model.vo.ExamRoomTypeVo;
import com.hyt.it.ogt.kq.service.gov.model.vo.TaskTimeSubjectArrangeVO;
import com.hyt.it.ogt.kq.service.model.entity.Subject;
import com.hyt.loginfo.model.Organization;
import com.hyt.loginfo.model.User;
import com.hyt.loginfo.model.UserOrgAccessDTO;
import com.hyt.model.PageParam;

import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 科目信息表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-03-08
 */
public interface ISubjectService extends IService<Subject> {

    /**
     * 根据考试任务id查询科目
     * @param taskId 考试任务id
     * @return 科目数据
     */
    List<Subject> getSubjectByTaskId(String taskId);

    /**
     * 添加科目
     *
     * @param subjectParam 科目参数
     * @param user
     */
    void add(SubjectParam subjectParam, User user);

    /**
     * 修改科目
     * @param subject 科目参数
     */
    void update(Subject subject);

    /**
     * 根据id获取科目
     * @param subjectId 科目id
     * @return 科目数据
     */
    Subject query(String subjectId);

    /**
     * 根据报名id查询科目数据
     * @param taskId
     * @param bmSubjectId
     * @return
     */
    Subject queryByBmStudentId(String taskId, String bmSubjectId);

    /**
     * 根据科目id删除科目
     * @param subjectIds 科目id(多个科目id用英文逗号隔开)
     */
    void delete(String subjectIds);

    /**
     * 根据任务获取所有的科目信息 key：code，value：Subject
     * @param taskId
     * @return
     */
    Map<String,Subject> getSubjectMapKeyId(String taskId);

    /**
     * 根据考试任务id获取科目id与科目编号的对应关系
     * @param taskId 考试任务id
     * @return 科目id与科目编号的对应关系
     */
    List<Subject> getIdCode(String taskId);

    /**
     * 根据考试任务id删除科目
     * @param taskId 考试任务id
     */
    void deleteByTaskId(String taskId);

    /**
     * 考试任务下是否存在指定id的科目
     * @param taskId 考试任务id
     * @param subjectId 科目id
     * @return true：存在，false：不存在
     */
    boolean hasSubject(String taskId, String subjectId);

    /**
     * 根据考试任务id、科目编号获取科目
     * @param taskId 考试任务id
     * @param subjectCodes 科目编号
     * @return 科目
     */
    List<Subject> listByCodes(String taskId, Collection<?> subjectCodes);

    /**
     * 根据批次科目id获取科目数据
     * @param timeSubjectId 批次科目id
     * @return 科目数据
     */
    Subject getByTimeSubjectId(String timeSubjectId);

    /**
     * 根据考试任务id获取科目数
     * @param taskId 考试任务id
     * @return 科目数
     */
    Integer countByTaskId(String taskId);

    /**
     * 查询批次选择的科目
     * @param param
     * @return
     */
    List<TaskTimeSubjectArrangeVO> taskTimeSubjectArrange(TaskTimeSubjectArrangeDTO param);

    /**
     * 批次绑定科目
     *
     * @param param
     * @param user
     * @return
     */
    Boolean bingTimeSubject(TimeSubjectBindingDTO param, User user);

    /**
     * 导入机构平台科目
     *
     * @param params
     * @param user
     * @return
     */
    void importPt(TaskSubjectImportDTO params, User user);

    /**
     * 从平台获取考场类型表表
     * @param user
     * @return
     */
    List<ExamRoomTypeVo> queryExamRoomTYpes();

    /**
     * 获取部门权限部门列表
     * @param user
     * @return
     */
    UserOrgAccessDTO getAccessOrgsByUserId(User user);

    /**
     * 当前用户所在机构的所有组织层级，不限制当前用户的层级
     * @return
     */
    Map<String, Organization> getOfficeAllDepts();

    /**
     * 获取任务区域信息
     * @return
     */
    List<OfficeAreaSheet> getOfficeAreaSheet();

    /**
     * 导入科目信息
     *
     * @param file
     * @param taskId
     * @param user
     * @return
     */
    void importSubject(String fileUrl, String taskId, User user) throws Exception;

    //获取平台的区域map key = id value = object
   Map<String, TaskArea> getAllAreaMap();

    /**
     * 分页查询
     *
     * @param pageParam
     * @param taskId
     * @param searchText
     * @return
     */
    Page<Subject> pageQuery(PageParam<Subject> pageParam, String taskId, String searchText);

    /**
     * 查询平台科目
     * @param pageParam
     * @param param
     * @param user
     */
    Page<ExamSubjectDTO> queryFromPt(PageParam<Subject> pageParam, ExamSubjectParam param, User user);

    /**
     * 查询任务绑定的科目
     * @param taskId
     * @param user
     * @return
     */
    List<String> queryTaskSubject(String taskId, User user);

    /**
     * 科目参数重复性校验
     * @param subject 科目参数
     * @throws KqException 参数校验不通过，抛出异常
     */
    void checkSubjectRepeat(Subject subject) throws KqException;

    int getLastTimeRoomCode(String taskId);

    /**
     * 生成科目xml
     * @param taskId
     * @return
     */
    File createXml(String taskId);

}
